From: Keir Fraser Date: Wed, 11 Jun 2008 14:19:42 +0000 (+0100) Subject: MSI: Fix msi delivery for hvm guest X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14200^2~50 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22Dat/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22Dat?a=commitdiff_plain;h=12030c7882b5046ddf3f73480599567b94a2f79e;p=xen.git MSI: Fix msi delivery for hvm guest Some parameters like "dest_mode", "delivery_mode" and "trig_mode" seem to have been miscalculated before delivering MSI interrupt into hvm passthru guest. This will cause guest driver to roll back to legacy interrupt mode. Signed-off-by: Wei Wang --- diff --git a/xen/arch/x86/hvm/vmsi.c b/xen/arch/x86/hvm/vmsi.c index 60497e4b10..d6ad008f4a 100644 --- a/xen/arch/x86/hvm/vmsi.c +++ b/xen/arch/x86/hvm/vmsi.c @@ -110,15 +110,21 @@ static void vmsi_inj_irq( #define VMSI_DELIV_MASK 0x7000 #define VMSI_TRIG_MODE 0x8000 +#define GFLAGS_SHIFT_DEST_ID 0 +#define GFLAGS_SHIFT_RH 8 +#define GFLAGS_SHIFT_DM 9 +#define GLFAGS_SHIFT_DELIV_MODE 12 +#define GLFAGS_SHIFT_TRG_MODE 15 + int vmsi_deliver(struct domain *d, int pirq) { struct hvm_irq_dpci *hvm_irq_dpci = d->arch.hvm_domain.irq.dpci; uint32_t flags = hvm_irq_dpci->mirq[pirq].gmsi.gflags; int vector = hvm_irq_dpci->mirq[pirq].gmsi.gvec; - uint16_t dest = flags & VMSI_DEST_ID_MASK; - uint8_t dest_mode = flags & VMSI_DM_MASK; - uint8_t delivery_mode = flags & VMSI_DELIV_MASK; - uint8_t trig_mode = flags & VMSI_TRIG_MODE; + uint16_t dest = (flags & VMSI_DEST_ID_MASK) >> GFLAGS_SHIFT_DEST_ID; + uint8_t dest_mode = (flags & VMSI_DM_MASK) >> GFLAGS_SHIFT_DM; + uint8_t delivery_mode = (flags & VMSI_DELIV_MASK) >> GLFAGS_SHIFT_DELIV_MODE; + uint8_t trig_mode = (flags & VMSI_TRIG_MODE) >> GLFAGS_SHIFT_TRG_MODE; uint32_t deliver_bitmask; struct vlapic *target; struct vcpu *v;